#include "ThreadPool.hpp"
#include "Task.hpp"
#include "Log.hpp"
// #include <memory>

// 测试线程一直在运行
// int main()
// {
//     // std::unique_ptr<ThreadPool> tp = std::make_unique<ThreadPool>(); // C++14
//     ThreadPool<int>* tp = new ThreadPool<int>();
//     tp->Init();
//     tp->Start();
//     while(true)
//     {
//         sleep(1);
//     }
//     return 0;
// }

// 实现一直推送任务的测试
// int main()
// {
//     // std::unique_ptr<ThreadPool> tp = std::make_unique<ThreadPool>(); // C++14
//     ThreadPool<Task>* tp = new ThreadPool<Task>();
//     tp->Init();
//     tp->Start();
//     while(true)
//     {
//         // 不断地向线程池推送任务
//         Task t(1,1);
//         tp->Equeue(t);
//         sleep(1);
//     }
//     return 0;
// }


// 测试一段时间线程池停止运行
// int main()
// {
//     ThreadPool<Task>* tp = new ThreadPool<Task>();
//     tp->Init();
//     tp->Start();
//     int cnt = 10;
//     // 执行10次循环结束
//     while(cnt)
//     {
//         Task t(1,1);
//         tp->Equeue(t);
//         sleep(1);
//         std::cout << "cnt: " << cnt-- << std::endl;
//     }
//     // 新线程停止
//     tp->Stop();
//     std::cout << "thread pool stop " << std::endl;
//     // 5秒后主线程结束
//     sleep(5);
//     return 0;
// }

using namespace log_ns;

// 测试日志
// int main()
// {
//     // GetCurrTime();
//     // std::cout << GetCurrTime() << std::endl;

//     // Log lg;
//     // // 显示器测试(默认)
//     // lg.logMessage("main.cc",10,DEBUG,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);
//     // // 文件测试
//     // lg.Enable(FILE_TYPE);
//     // lg.logMessage("main.cc",10,DEBUG,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);
//     // C语言宏替代文件名行号
//     // lg.logMessage(__FILE__,__LINE__,DEBUG,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);

//     // Log lg;
//     // // 直接使用使用宏像函数一样打印
//     // LOG(DEBUG,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);
//     // // 向哪里打印也使用宏
//     // EnableScreen();
//     // LOG(WARNING,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);
//     // LOG(DEBUG,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);
//     // EnableFile();
//     // LOG(WARNING,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);
//     // LOG(DEBUG,"hello %d,hello %c hello %f\n",1000,'A',3.14);
//     // sleep(1);

//     Log lg;

//     // 没有可变参数
//     EnableScreen();
//     LOG(INFO,"helloworld\n"); // 宏替换时加##
//     return 0;
// }

// 测试日志版线程池
// int main()
// {
//     ThreadPool<Task>* tp = new ThreadPool<Task>();
//     tp->Init();
//     tp->Start();
//     int cnt = 5;
//     // 执行5次循环结束
//     while(cnt)
//     {
//         Task t(1,1);
//         tp->Equeue(t);
//         LOG(INFO,"equeue a task,%s\n",t.debug().c_str());
//         cnt--;
//         sleep(1);
//     }
//     // 新线程停止
//     tp->Stop();
//     LOG(INFO,"thread pool stop\n");
//     // 5秒后主线程结束
//     sleep(5);
//     return 0;
// }

// 测试日志单例模式版线程池
int main()
{
    // 测试是否为单例
    ThreadPool<Task>* tp1 = new ThreadPool<Task>();
    ThreadPool<Task> tp2 = *(ThreadPool<Task>::GetInstance());

    // int cnt = 5;
    // // 执行5次循环结束
    // while(cnt)
    // {
    //     Task t(1,1);
    //     ThreadPool<Task>::GetInstance()->Equeue(t);
    //     LOG(INFO,"equeue a task,%s\n",t.debug().c_str());
    //     cnt--;
    //     sleep(1);
    // }
    // // 新线程停止
    // ThreadPool<Task>::GetInstance()->Stop();
    // LOG(INFO,"thread pool stop\n");
    // // 5秒后主线程结束
    // sleep(5);
    return 0;
}